import { Controller, Get, Post, Body, Patch, Param, Delete, Query, UseInterceptors, UploadedFile, ParseFilePipe, FileTypeValidator, MaxFileSizeValidator, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { FileInterceptor } from '@nestjs/platform-express';
import { ProductService } from './product.service';
import { ProductQueryDto } from './dto/product-query.dto';
import { CreateCategoryDto } from './dto/create-category.dto';
import { UpdateCategoryDto } from './dto/update-category.dto';
import { CreateProductDto } from './dto/create-product.dto';

/**
 * 商品控制器
 * 处理商品和分类相关的API请求
 */
@Controller('products')
export class ProductController {
  constructor(private readonly productService: ProductService) {}

  /**
   * 创建新商品
   * @param createProductDto - 包含商品信息的请求体
   * @returns 新创建的商品对象
   */
  @Post('create')
  create(@Body() createProductDto: CreateProductDto) {
    console.log('createProductDto', createProductDto)
    return this.productService.createProduct(createProductDto);
  }

  /**
   * 获取商品列表
   * @param query - 包含分页、搜索和分类筛选参数的查询对象
   * @returns 分页商品列表
   */
  @Get()
  @UseGuards(AuthGuard('jwt'))//只有携带有效JWT令牌的请求才能访问
  findAll(@Query() query: ProductQueryDto) {
    return this.productService.findAllProducts(query);
  }

  /**
   * 获取所有商品分类
   * @returns 分类列表数组
   */
  @Get('categories')
  findAllCategories() {
    return this.productService.findAllCategories();
  }

  /**
   * 获取单个分类详情
   * @param id - 分类ID
   * @returns 分类详情对象
   */
  @Get('categories/:id')
  findOneCategory(@Param('id') id: string) {
    return this.productService.findCategoryById(id);
  }

  /**
   * 创建新分类
   * @param createCategoryDto - 包含分类名称和描述的DTO对象
   * @returns 新创建的分类对象
   */
  @Post('categories')
  createCategory(@Body() createCategoryDto: CreateCategoryDto) {
    return this.productService.createCategory(createCategoryDto);
  }

  /**
   * 更新分类信息
   * @param id - 分类ID
   * @param updateCategoryDto - 包含更新信息的DTO对象
   * @returns 更新后的分类对象
   */
  @Patch('categories/:id')
  updateCategory(@Param('id') id: string, @Body() updateCategoryDto: UpdateCategoryDto) {
    return this.productService.updateCategory(id, updateCategoryDto);
  }

  /**
   * 删除分类
   * @param id - 分类ID
   * @returns 删除结果
   */
  @Delete('categories/:id')
  removeCategory(@Param('id') id: string) {
    return this.productService.removeCategory(id);
  }

  /**
   * 批量导入分类
   * @param file - Excel文件
   * @returns 导入结果
   */
  @Post('categories/import')
  @UseInterceptors(FileInterceptor('file'))
  importCategories(
    @UploadedFile(
      new ParseFilePipe({
        validators: [
          new FileTypeValidator({
            fileType: /^(application\/vnd\.openxmlformats-officedocument\.spreadsheetml\.sheet|application\/vnd\.ms-excel)$/
          }),
          new MaxFileSizeValidator({ maxSize: 1024 * 1024 * 5 }), // 5MB
        ],
      })
    ) file: Express.Multer.File
  ) {
    return this.productService.importCategories(file.buffer);
  }

  /**
 * 批量导入商品
 * @param file - Excel文件
 * @returns 导入结果
 */
  @Post('product/import')
  @UseInterceptors(FileInterceptor('file'))
  importProducts(
    @UploadedFile(
      new ParseFilePipe({
        validators: [
          new FileTypeValidator({
            fileType: /^(application\/vnd\.openxmlformats-officedocument\.spreadsheetml\.sheet|application\/vnd\.ms-excel)$/
          }),
          new MaxFileSizeValidator({ maxSize: 1024 * 1024 * 5 }), // 5MB
        ],
      })
    ) file: Express.Multer.File
  ) {
    return this.productService.importProducts(file.buffer);
  }

  /**
   * 获取商品详情
   * @param id - 商品ID
   * @returns 商品详情对象
   */
  @Get(':id')
  findOne(@Param('id') id: string) {
    return this.productService.findOneProduct(id);
  }
}